package malagaAcoge.controller.daos;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import malagaAcoge.model.entities.Usuario;
import malagaAcoge.utils.JPAUtils;

public class UsuarioDao {
	private static JPAUtils jpaUtils;
	protected static EntityManager em;

	public UsuarioDao() {
		jpaUtils = new JPAUtils();
	}

	@SuppressWarnings("unchecked")
	public static List<Usuario> findAll() {
		List<Usuario> usuarios = new ArrayList<Usuario>();
		try {
			em = jpaUtils.getEntityManager();
			Query q = em.createQuery("select u from Usuario u order by u.idUsuario desc");
			usuarios = q.getResultList();
		} catch (Exception e) {
			System.out.println("Error en metodo findAllUsuario");
			e.printStackTrace();
		} finally {
			em.close();
		}
		return usuarios;

	}

	public static Usuario findUsuario(int id) {
		Usuario usuario = null;
		try {
			em = jpaUtils.getEntityManager();
			usuario = (Usuario) em.find(Usuario.class, id);
		} catch (Exception e) {
			System.out.println("Error en metodo findUsuario");
			e.printStackTrace();
		} finally {
			em.close();
		}
		return usuario;

	}

	public static void createUsuario(Usuario usuario) {
		try {
			em = jpaUtils.getEntityManager();
			em.getTransaction().begin();
			em.persist(usuario);
			em.getTransaction().commit();
		} catch (Exception e) {
			System.out.println("Error en metodo createUsuario:");
			e.printStackTrace();
		} finally {
			em.close();
		}

	}

	public static void updateUsuario(Usuario usuario) {
		try {
			em = jpaUtils.getEntityManager();
			em.getTransaction().begin();
			em.merge(usuario);
			em.getTransaction().commit();

		} catch (Exception e) {
			System.out.println("Error en metodo updateUsuario:");
			e.printStackTrace();
		} finally {
			em.close();
		}
	}

	public static void deleteUsuario(int idUsuario) {
		try {
			em = jpaUtils.getEntityManager();
			Usuario usuario = em.find(Usuario.class, idUsuario);
			if (usuario != null) {
				em.getTransaction().begin();
				em.remove(usuario);
				em.getTransaction().commit();
			}
		} catch (Exception e) {
			System.out.println("Error en metodo deleteUsuario:");
			e.printStackTrace();
		} finally {
			em.close();
		}
	}

	public static void mergeUsuario(Usuario usuario) {
		try {
			em = jpaUtils.getEntityManager();
			em.getTransaction().begin();
			em.merge(usuario);
			em.getTransaction().commit();
		} catch (Exception e) {
			System.out.println("Error en metodo updateUsuario:");
			e.printStackTrace();
		} finally {
			em.close();
		}
	}

	public static List<String> todasNacionalidades() {
		List<String> paises = new ArrayList<String>();
		try {
			em = jpaUtils.getEntityManager();
			Query q = em.createQuery("select Distinct u.nacionalidad from Usuario u");
			paises = q.getResultList();
		} catch (Exception e) {
			System.out.println("Error en metodo todasNacionalidades:");
			e.printStackTrace();
		} finally {
			em.close();
		}
		return paises;
	}
}
